package jdklearning.transienttest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


class UserInfo implements Serializable {  
    private static final long serialVersionUID = 996890129747019948L;  
    private static String name;
    private transient String psw;  

    public UserInfo(String name, String psw) {  
        this.name = name;  
        this.psw = psw;  
    }  

    public static String getName() {
        return name;
    }

    public static void setName(String name) {
        UserInfo.name = name;
    }

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }

    public String toString() {  
        return "name=" + name + ", psw=" + psw;  
    }  
}  


/**
 * 1，一旦变量被transient修饰，变量将不再是对象持久化的一部分，该变量内容在序列化后无法获得访问。 
　　2，transient关键字只能修饰变量，而不能修饰方法和类。注意，本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量，则该类需要实现Serializable接口。 
　　3，被transient关键字修饰的变量不再能被序列化，一个静态变量不管是否被transient修饰，均不能被序列化。 
　　对于第三点，加上static之后，依然能把姓名输出。这是因为：反序列化后类中static型变量name的值为当前JVM中对应static变量的值，这个值是JVM中的不是反序列化得出的。下例可说明，其值时JVM中得到的而不是反序列化得到的
 * @author Administrator
 *
 */
public class TestTransient {
    public static void main(String[] args) {  
        UserInfo userInfo = new UserInfo("张三", "123456"); 
        System.out.println(userInfo);  
        try {  
            // 序列化，被设置为transient的属性没有被序列化  
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("UserInfo.txt"));  
            o.writeObject(userInfo);  
            o.close();  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
        try {  
            //在反序列化之前改变name的值
            userInfo.setName("hello");
            // 重新读取内容  
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("UserInfo.txt"));  
            UserInfo readUserInfo = (UserInfo) in.readObject();  
            //读取后psw的内容为null  
            System.out.println(readUserInfo.toString());  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
    }  
}
